package com.teemor.common.idempotentspringbootstarter.annotation;

import com.teemor.common.idempotentspringbootstarter.cache.KeyCache;
import com.teemor.common.idempotentspringbootstarter.fallback.CallFallback;
import com.teemor.common.idempotentspringbootstarter.valid.KeyValidtor;
import com.teemor.common.idempotentspringbootstarter.cache.DefaultKeyCache;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 标注幂等方法，需要对应的接口或者类标注了
 * {@link Idempotent} 注解才能生效
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface IdempotentApi {

    /**
     * 配置需要判断幂等的字段名
     * 如果是多个字段联合限制可以配置多个
     * @return
     */
    String[] keys();

    /**
     * 接口重复访问时返回提示信息
     * @return
     */
    String  message() default "";

    /**
     * 重复访问时降级方法
     * @return
     */
    Class<? extends CallFallback> fallback() default CallFallback.class;

    /**
     * 是否需要缓存key
     * @return
     */
    boolean isCache() default true;

    /**
     * key 缓存处理类
     * @return
     */
    Class<? extends KeyCache> cacheClazz() default DefaultKeyCache.class;

    /**
     * 缓存时间
     * @return
     */
    long cacheTime() default 24 * 60 *60;

    /**
     * 负责幂等校验的类
     * @return
     */
    Class<? extends KeyValidtor> validClazz() default KeyValidtor.class;
}
